package june.testappwidget;

import java.util.Formatter.BigDecimalLayoutForm;

import android.app.Activity;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.widget.RemoteViews;

public class TestWidgetProvider extends AppWidgetProvider {

	private static final String CLICK_ACTION = "com.huewu.example.widget.CLICK";
	private static final String CHECKED = "checked";

	//앱위젯프로마이더는 브로드캐스트 리시버의 생명주기를 따라가기때문에 온리시버의 호출이 완료된 시점에서
	//이 인스턴스들은 소멸된다. 이후 다른 브로드캐스트가 수신되면 새롭게 생성될뿐.
	//즉 이 블린 변수의 경우 계속해서 false값만을 유지하게된다.
	//이를 해결하기 위한 방법으로 static이나 인텐트의 번들, 프리페어런스로 기록해야한다.
	private boolean isChecked = false;

	@Override
	public void onReceive(Context context, Intent intent) {

		
		//해당 액션을 체크. 발생된 인텐트가 해당액션과 같다면 아래 조건이 동작한다.
		if (intent.getAction().equals(CLICK_ACTION) == true) {
			// button is clicked.
			SharedPreferences pref = context.getSharedPreferences(CHECKED,Activity.MODE_PRIVATE);
			isChecked = pref.getBoolean(CHECKED, true); // default value is
														// true.
			Editor e = pref.edit();
			e.putBoolean(CHECKED, !isChecked);
			e.commit();
			// isChecked = intent.getBooleanExtra(CHECKED, false);
			// isChecked = !isChecked; //toggle button.
			// Update Widgets.
			AppWidgetManager manager = AppWidgetManager.getInstance(context);
			this.onUpdate(context, manager, manager.getAppWidgetIds(new ComponentName(context, TestWidgetProvider.class)));
		} else {
			super.onReceive(context, intent);
		}
	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

		final int N = appWidgetIds.length;
		TestDrawable td = new TestDrawable();
		
		Bitmap b = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888);
		Canvas c = new Canvas(b);
		td.setBounds(0,0,50,50);
		td.draw(c);

		// Perform this loop procedure for each App Widget that belongs to this
		// provider
		for (int i = 0; i < N; i++) {
			int appWidgetId = appWidgetIds[i];

			//액션지정. 지정된 액션이 리시버에 등록되어있음으로 이 인텐트가 발생할경우 온리시버가 호출된다.
			Intent intent = new Intent(CLICK_ACTION); // button is clicked.
			intent.putExtra(CHECKED, isChecked);
			
			//팬딩인텐트 설정. FLAG_UPDATE_CURRENT를 설정하는 이유는 안드로이드 프레임웍이 동일한형식의 팬딩인테트를 하나만 유지하기 때문이다.
			//그래서 플래그를통해 현재 발행된 팬딩인텐트값을 업데이트 해줄것을 요청하는것. 단, 디바이스를 재부팅할경우 상태값이 초기화된다.
			PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
			
			//리모트뷰 설정. 액티비티가 아님으로 일반적 파인드 방법으론 아이디를 찾아올 수 없다.
			//리모트뷰를 통해 셋시키는 방법뿐.
			RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
			if (isChecked == true)
				views.setImageViewResource(R.id.onoff, R.drawable.on);
			else
				views.setImageViewResource(R.id.onoff, R.drawable.off);
//				views.setImageViewBitmap(R.id.onoff, b);
			
			
			//그리고 아이디값에 팬딩인텐트를설정.
			views.setOnClickPendingIntent(R.id.onoff, pendingIntent);
			//아이디와 뷰를 업데이트.
			appWidgetManager.updateAppWidget(appWidgetId, views);
		}
	}

}// end of class

